package gnv;

import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import org.eclipse.swt.widgets.Display;

public class Pedido {

	
	private String nombre;
	private String direccion;
	private String idDireccion;
	private long idPedido;
	private Object idCliente;
	private BigDecimal precio;
	private BigDecimal paga;
	private String fechaEntrega;
	private int entregado;
	
	public void setIdDireccion(String idDireccion) {
		this.idDireccion = idDireccion;
	}

	public String getIdDireccion() {
		return idDireccion;
	}

	public void setIdCliente(Object idCliente) {
		this.idCliente = idCliente;
	}

	public Object getIdCliente() {
		return idCliente;
	}

	public void setIdPedido(long idPedido) {
		this.idPedido = idPedido;
	}

	public long getIdPedido() {
		return idPedido;
	}

	public String getDireccion() {
		return direccion;
	}

	public void setDireccion(String direccion) {
		this.direccion = direccion;
	}

	public String getNombre() {
		return nombre;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
	
	
	
	
	
	
	
	
	
	public BigDecimal getPrecio() {
		return precio;
	}

	public void setPrecio(BigDecimal precio) {
		this.precio = precio;
	}

	public BigDecimal getPaga() {
		return paga;
	}

	public void setPaga(BigDecimal paga) {
		this.paga = paga;
	}

	public String getFechaEntrega() {
		return fechaEntrega;
	}

	public void setFechaEntrega(String fechaEntrega) {
		this.fechaEntrega = fechaEntrega;
	}

	public int getEntregado() {
		return entregado;
	}
	
	public void setEntregado(int entregado) {
		this.entregado = entregado;
	}

	public void crearPedido(Object idCliente){
		long result = -1;
		try {
			String sql = "select crear_pedido(?)";
			Connection conn = ConexionDB.dbConnect();
			conn.setAutoCommit(false);
			java.sql.PreparedStatement ps = conn.prepareStatement(sql);
		    ps.setObject(1, idCliente);
		    ps.execute();
		    conn.commit();
		    ResultSet rs = ps.getResultSet();
		    rs.next();
		    result = rs.getLong(1);
		    this.setIdPedido(result);
		    
		    rs.close();
		    conn.close();
		}catch(SQLException error){
			error.printStackTrace();
		}catch (Exception error2){
			
		}
		
	}

	public String agregarItem(Object idPedido, Object idProducto, Object Cantidad){
		BigDecimal res = new BigDecimal(0);
		BigDecimal cant = new BigDecimal(Cantidad.toString());
		try {
			String sql = "call agregar_Producto_Pedido(?,?,?)";
			Connection conn = ConexionDB.dbConnect();
			conn.setAutoCommit(false);
			PreparedStatement ps = conn.prepareStatement(sql);
			ps.setObject(1, idPedido);
			ps.setObject(2, idProducto);
			ps.setObject(3, cant.setScale(2, BigDecimal.ROUND_UNNECESSARY));
			ps.execute();
			conn.commit();
			ResultSet rs = ps.getResultSet();
			while (rs.next()){
				try {
					double p = Double.parseDouble(rs.getString(1));
					res = BigDecimal.valueOf(p);
				}catch (NumberFormatException err){
					Alertas.Error(Display.getDefault().getActiveShell(), "Error", rs.getString(1));
				}
			}
		}catch(Exception error){
			error.printStackTrace();
		}
		return res.setScale (2, BigDecimal.ROUND_HALF_EVEN).toString();
	}

	public boolean eliminarItem(Object idPedido, Object idItemPedido){
		try {
			String sql = "delete from pedido_diario where (ID_PEDIDO = ? and ID_PEDIDO_DIARIO  = ?)";
			Connection conn = ConexionDB.dbConnect();
			conn.setAutoCommit(false);
			PreparedStatement ps = conn.prepareStatement(sql);
			ps.setObject(1, idPedido);
			ps.setObject(2, idItemPedido);
			ps.execute();
			conn.commit();
			ResultSet rs = ps.getResultSet();
			while (rs.next()){
				return true;
			}
		}catch (Exception err){
		}
		return false;
	}
	
	
	public void deliveryCost(){
		try {
			String sql = "update pedido set costo_envio = ? where id_pedido=? ";
			Connection conn = ConexionDB.dbConnect();
			PreparedStatement ps = conn.prepareStatement(sql);
			ps.setObject(1, idPedido);
			ps.setLong(2, this.getIdPedido());
			ps.execute();
		}catch (Exception error){
			error.printStackTrace();
		}
	}


	public String totalPedido(){
		BigDecimal res = new BigDecimal(0);
		try {
			String sql = "select total_pedido(?)";
			Connection conn = ConexionDB.dbConnect();
			conn.setAutoCommit(false);
			PreparedStatement ps = conn.prepareStatement(sql);
			ps.setObject(1, this.getIdPedido());
			ps.execute();
			conn.commit();
			ResultSet rs = ps.getResultSet();
			while (rs.next()){
				try {
					double p = Double.parseDouble(rs.getString(1));
					res = BigDecimal.valueOf(p);
					
				}catch (NumberFormatException err){
				}catch (NullPointerException e){
				}
			}
		}catch(Exception error){
			error.printStackTrace();
		}
		return res.setScale (2, BigDecimal.ROUND_HALF_EVEN).toString();
	}
	

	public String pagoPedido(){
		BigDecimal res = new BigDecimal(0);
		
		try {
			String sql = "select pago_pedido from pedido where id_pedido = ?";
			Connection conn = ConexionDB.dbConnect();
			conn.setAutoCommit(false);
			PreparedStatement ps = conn.prepareStatement(sql);
			ps.setObject(1, this.getIdPedido());
			ps.execute();
			conn.commit();
			ResultSet rs = ps.getResultSet();
			
			while (rs.next()){
				
				try {
					double p = Double.parseDouble(rs.getString(1));
					res = BigDecimal.valueOf(p);
					
				}catch (NumberFormatException err){
				//	Alertas.Error(Display.getDefault().getActiveShell(), "Error", rs.getString(1));
				}
				
			}
			
			/*} */
		
		//	rs.close();
		//	conn.close();
		}catch(Exception error){
			error.printStackTrace();
		}
		return res.setScale (2, BigDecimal.ROUND_HALF_EVEN).toString();
	}

	
	
	
	
	
	public String vuelto(String importe, String total){
		BigDecimal res = new BigDecimal(0);
		BigDecimal tot = new BigDecimal(0);
		try {
		
			double valor = Double.parseDouble(importe);
			double t = Double.parseDouble(total);
			res = BigDecimal.valueOf(valor);
			tot = BigDecimal.valueOf(t);
			

		}catch (NumberFormatException err){
			
		}				
		return res.subtract(tot).setScale(2, BigDecimal.ROUND_HALF_UP).toString();
	}
	
	
	public void cerrarPedido(Object idPedido, Object metodo, Object idDireccion, BigDecimal paga, String fecha){
		
		try {
			String sql = "call cerrar_Pedido(?,?,?,?,?)";
			Connection conn = ConexionDB.dbConnect();
			conn.setAutoCommit(false);
			PreparedStatement ps = conn.prepareStatement(sql);
			ps.setObject(1, idPedido);
			ps.setObject(2, metodo);
			ps.setObject(3, idDireccion);
			
			ps.setBigDecimal(4, paga);
			ps.setString(5, fecha);
			ps.execute();
			
		    conn.commit();
			conn.close();
		}catch(Exception e){
			e.printStackTrace();
		}

	}
	
	public void eliminarPedido(Object idPedido){
		try {
			String sql = "call eliminar_Pedido(?)";
			Connection conn = ConexionDB.dbConnect();
			conn.setAutoCommit(false);
			PreparedStatement ps = conn.prepareStatement(sql);
			ps.setObject(1, this.getIdPedido());
			ps.execute();
			conn.commit();
			conn.close();
		}catch(Exception error){
			error.printStackTrace();
		}
	
	}

	public void modificarAutoIncrement(Object idPedido){
		try {
			String sql = "alter table pedido AUTO_INCREMENT=?";
			Connection conn = ConexionDB.dbConnect();
			conn.setAutoCommit(false);
			PreparedStatement ps = conn.prepareStatement(sql);
			ps.setObject(1, this.getIdPedido());
			ps.execute();
			conn.commit();
			conn.close();
		}catch(Exception error){
			error.printStackTrace();
		}
	}
	
	
	
	public Pedido getPedidoDB(Object idPedido){
		try{
			String sql = "SELECT  ID_PEDIDO as id, ID_DIRECCION as direccion, " +
					"PRECIO_PEDIDO as precio, PAGO_PEDIDO as paga, " +
					"FECHA_ENTREGA_PEDIDO as fecha, id_cliente as cliente " +
					"FROM pedido WHERE (ID_PEDIDO =?)";
			
			java.sql.Connection conn = ConexionDB.dbConnect();
			java.sql.PreparedStatement ps = conn.prepareStatement(sql);
			ps.setObject(1, idPedido);
			ps.execute();
			Pedido ped = new Pedido();
			if (ps.getResultSet().next()){
				ped.setIdPedido(ps.getResultSet().getLong(1));
				ped.setDireccion(ps.getResultSet().getString(2));
				ped.setPrecio(ps.getResultSet().getBigDecimal(3));
				ped.setPaga(ps.getResultSet().getBigDecimal(4));
				ped.setFechaEntrega(ClienteGUI.FechaParaJava(ps.getResultSet().getString(5)));
				ped.setIdCliente(ps.getResultSet().getObject(6));
				ped.setEntregado(0);
			}
			return ped;
		}catch (Exception error){
		}
		return null;
	}

	public Pedido getPedidoHistorico(Object idPedido){
		try{
			String sql = "SELECT ID_PEDIDO as id, concatenar_historico(ID_PEDIDO,7) as direccion, PRECIO_PEDIDO as precio, PAGO_PEDIDO as paga, FECHA_ENTREGA_PEDIDO as fecha, NOMBRE_CLIENTE as cliente FROM historico_pedidos WHERE (ID_PEDIDO = ?)";
			
			java.sql.Connection conn = ConexionDB.dbConnect();
			java.sql.PreparedStatement ps = conn.prepareStatement(sql);
			ps.setObject(1, idPedido);
			ps.execute();
			Pedido ped = new Pedido();
			if (ps.getResultSet().next()){
				ped.setIdPedido(ps.getResultSet().getLong(1));
				ped.setDireccion(ps.getResultSet().getString(2));
				ped.setPrecio(ps.getResultSet().getBigDecimal(3));
				ped.setPaga(ps.getResultSet().getBigDecimal(4));
				ped.setFechaEntrega(ClienteGUI.FechaParaJava(ps.getResultSet().getString(5)));
				ped.setIdCliente(ps.getResultSet().getObject(6));
				ped.setEntregado(1);
			}
			return ped;
		}catch (Exception error){
			error.printStackTrace();
		}
		return null;
	}

	
	public void actualizarPedido(){
		try {
			String sql = "update pedido set PAGO_PEDIDO = ?, " +
					"FECHA_ENTREGA_PEDIDO = ?, " +
					"ID_DIRECCION = ?," +
					"PRECIO_PEDIDO = ? where id_pedido = ?";
			Connection conn = ConexionDB.dbConnect();
			conn.setAutoCommit(false);
			PreparedStatement ps = conn.prepareStatement(sql);
			ps.setObject(1, this.getPaga());
			ps.setObject(2, ClienteGUI.FechaParaMySql(this.getFechaEntrega()));
			ps.setObject(3, this.getIdDireccion());
			ps.setObject(4, this.getPrecio());
			ps.setObject(5, this.getIdPedido());
			ps.execute();
			conn.commit();
			conn.close();
		}catch(Exception error){
			System.err.println(error.getMessage());
			error.printStackTrace();
		}

	}

	public void modificarCantidadItemPedido(Object idItemPedido, String cantidad){
			try {
			String sql = "call actualizar_Item_Pedido(?,?)";
			Connection conn = ConexionDB.dbConnect();
			conn.setAutoCommit(false);
			PreparedStatement ps = conn.prepareStatement(sql);
			ps.setObject(1, idItemPedido);
			ps.setObject(2, new BigDecimal(cantidad).setScale(2, BigDecimal.ROUND_UNNECESSARY));
			ps.execute();
			conn.commit();
			conn.close();
		}catch(Exception error){
			System.err.println(error.getMessage());
			error.printStackTrace();
		}

	}
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
}

